[Go] 環境安裝與設定


圖片源

前言

本篇用於記錄Go的安裝、環境設定等前置工作。

安裝Go

Mac OSX的話可以直接從Terminal用Homebrew進行安裝:

1
brew install go

或是透過官方下載

Go會在系統內預設一個專屬於放置所有Go專案的資料夾

查看相關資訊及設定

查看版本

1
go version

查看Go語言的環境變數與使用工具的配置等資訊。

1
go env

執行指令後可以看到許多相關資訊

查看Go工作目錄

go命令仰賴一個重要的環境變數:GOPATH,為Go的工作目錄,集中管理code, package和執行檔,執行下面的指令可以看到目前go的工作目錄

1
go env GOPATH

或是執行以下方法

1
echo $GOPATH

1
/Users/tsungyuchen/go

如果想要在非預設工作區的路徑工作,那麼你需要設定GOPATH環境變數指向那個目錄

GOPATH 路徑問題

解決方法

GOROOT

Golang主程式安裝的位置

設置的環境變數

如果是bash中設置

1
vim .bash_profile

使修改立刻生效

1
source .bash_profile

編譯成二元檔

執行go build將檔案進compile成二元的執行檔(給機器讀的)

執行為執行檔

如:./main: 執行名為main 的執行檔

查看編譯後的二進制檔案

指令: ls -l

Packages

為該檔案的標題,同時也表示該檔案的內容摘要,必須寫在第一行。package main代表這個檔案內容標題為main,這是Go內建的規則,在執行.go的程式時,一定要執行名稱為main的package,若沒有按照規則,執行程式會出現以下錯誤訊息:

重要觀念:

  • Packages: 每個 Go 程式都是由package組成的,為了方便維護,盡量將package名稱和目錄名稱一致
    圖片來源

自定義一個package

Go可以自己定義一個package,在主要檔案引入該package時,加入import該package的資料夾名稱,而自定義的package若要匯出給其他使用,先定義該檔案下的package名稱、函式名稱。

若是自定義的檔案名稱,funtion名稱必須要是大寫。

範例:

若今天要自己定義一個package,在src目錄下建立名為add的資料夾名稱,並在其資料夾底下建立add.go的檔案,檔案內容如下
add.go

1
2
3
4
5
6
7
8
package add // 定義package名

import "fmt"

// function 必須為"大寫"
func Add() {
fmt.Println("This is add")
}

main.go匯入add

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"add"
"fmt"
)

func main() {
fmt.Println("main is here!")
add.Add() // 呼叫Add()
}
  • package 有兩種:執行用的package、函式庫的package

比較

函式庫的package

  • 不可被編譯,但可被不同專案引入
  • package名可以自訂
  • function名可以自訂,但必須要大寫

執行用的package

  • 用於執行整支程式
  • 不可被引入
  • 需有名為main的package名
  • 需有名為main的function名

匯入模組

import 套件名稱

fmt為format縮寫的套件名稱,主要用於調整及顯示內容。也可自訂的package名稱。

Go預設搜尋package是從src目錄底下開始搜尋

import自定義package時注意的點

  • 由於import只能指定資料夾,無法指定檔案
  • 同個資料夾底下只能有一個package,如:資料夾底下所有檔案的package名稱都統一是test_package

檔案主要執行的函式

若檔案內的package名稱是main,則一定要有一個是main名稱的function作為執行的函式。

若沒有的話,會出現錯誤訊息:

除了main之外,也可自定義其他funcion,但這些function不會主動執行,而是需要在main function內進行呼叫。
如下行範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
)

func main() {
fmt.Println("main here!1")
test()
}

func test() {
fmt.Println("test here!")
}

一次執行同個資料夾下多個.go檔案

當同個資料夾下有多個.go檔案時,在其中一個程式裡面呼叫其他檔案所定義的函式可以不需要import該檔案而直接呼叫,並執行

1
go run *.go

範例

假設今天名為test的資料夾下分別有一個main.gotest.go

test.go檔內的程式碼:

1
2
3
4
5
6
7
package main

import "fmt"

func test() {
fmt.Println("test here!")
}


main.go檔內的程式碼:

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
)

func main() {
fmt.Println("main here!")
test()
}


main.go檔內的程式碼在不引入test.go檔的情況下執行go run *.go時的執行結果:


成功呼叫test.go檔案裡面的test()函式。

但是!!!!

如果單獨執行main.go會出現undefined: test的錯誤訊息

原因:

go在run之前會先進行編譯操作,而在此處的編譯它只會以這個main.go為準,導致其他幾個引用文件中的方法出現找不到的情況(但採用go build的方式又不一樣,go會自動找引用文件並打包)

參考

Golang 官方教學

如何編寫Go程式

GOPATH 與工作空間

Go 程式設計導論

Go起步走 - 檔案基本結構

Comments